package com.ruoyi.common.utils.bean;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class BeanCopyUtils {

    /**
     * 复制源对象的属性到目标对象（仅复制同名同类型属性）
     * @param source 源对象
     * @param target 目标对象
     */
    public static void copyProperties(Object source, Object target) {
        if (source == null || target == null) {
            throw new IllegalArgumentException("源对象和目标对象不能为空");
        }

        Class<?> sourceClass = source.getClass();
        Class<?> targetClass = target.getClass();

        // 获取源对象的所有字段（包括私有字段）
        Field[] sourceFields = sourceClass.getDeclaredFields();
        for (Field sourceField : sourceFields) {
            // 跳过静态字段
            if (Modifier.isStatic(sourceField.getModifiers())) {
                continue;
            }

            try {
                // 设置字段可访问（私有字段需要）
                sourceField.setAccessible(true);
                String fieldName = sourceField.getName();

                // 在目标对象中查找同名字段
                Field targetField = targetClass.getDeclaredField(fieldName);
                // 检查字段类型是否一致
                if (targetField.getType().equals(sourceField.getType())) {
                    targetField.setAccessible(true);
                    // 复制值
                    targetField.set(target, sourceField.get(source));
                }
            } catch (NoSuchFieldException e) {
                // 目标对象中无此字段，跳过
                continue;
            } catch (IllegalAccessException e) {
                throw new RuntimeException("属性复制失败：" + e.getMessage(), e);
            }
        }
    }

    /**
     * 复制属性并返回新的目标对象
     * @param source 源对象
     * @param targetClass 目标类
     * @return 目标对象实例
     */
    public static <T> T copyProperties(Object source, Class<T> targetClass) {
        try {
            T target = targetClass.getDeclaredConstructor().newInstance();
            copyProperties(source, target);
            return target;
        } catch (Exception e) {
            throw new RuntimeException("创建目标对象失败：" + e.getMessage(), e);
        }
    }


}
